Technical Q&A QA1225
Finding Missing OpenGL CFM Entry Points


Q: OpenGL ÇégópÇ∑ÇÈ CFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇçÏê¨ÇµÇƒÇ¢Ç‹Ç∑ÅBçÏê¨ÇµÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇ Mac OS X 10.2 Ç≈é¿çsÇ∑ÇÈÇΔëSǃèáí≤Ç…ìÆçÏÇ∑ÇÈÇÃÇ≈Ç∑Ç™ÅA10.1 Ç≈é¿çsÇ∑ÇÈÇΔÅAì¡íËÇÃä÷êîÇ≈ÉäÉìÉJÉGÉâÅ[Ç™î≠ê∂ǵNjÇ∑ÅBǫǧǵÇΩÇÁǢǢÇÃÇ≈Ç∑Ç©ÅH

A: Mac OS X 10.1.x Çà OpenGL CFM ÉuÉäÉbÉWÉâÉCÉuÉâÉäÇ©ÇÁÅAÉäÉXÉg 1 Ç…ãìÇ∞ÇÈÇ¢Ç≠ǬǩÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇ™çÌèúÇ≥ÇÍNjǵÇΩÅBDZÇÃÇΩÇflÅADZÇÍÇÁÇÃÉãÅ[É`ÉìÇégópÇ∑ÇÈÉRÅ[ÉhÇé¿çsÇ∑ÇÈÇΔé¿çséûÇ…ÉGÉâÅ[ÇΔÇ»ÇËÇ‹Ç∑ÅBCFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕí èÌÅAOpenGL CFM ÉuÉäÉbÉWÉâÉCÉuÉâÉäÇ…ÇÊǡǃÉäÉìÉNÇ≥ÇÍÇΩ OpenGL ÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇé¿çséûÇ…é©ìÆìIÇ…åüèoǵNjÇ∑Ç™ÅADZÇÍÇÁÇÃÉäÉìÉNÇ≥ÇÍÇΩÉGÉìÉgÉäÉ|ÉCÉìÉgÇÕÉuÉäÉbÉWÉâÉCÉuÉâÉäÇ…ÇÊǡǃÉGÉNÉXÉ|Å[ÉgÇ≥ÇÍǃǢǻǢÇÃÇ≈ÅAé©ìÆìIÇ…åüèoÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅBDZÇÃñ‚ëËÇê•ê≥Ç∑ÇÈÇΩÇflÇ…ÅAÉäÉXÉg 2 Ç…é¶Ç∑ï˚ñ@Ç≈ÅAé∏ÇÌÇÍÇΩ CFM ÉGÉìÉgÉäÉ|ÉCÉìÉgÇÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃíÜÇ≈ìÆìIÇ…åüèoÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB ǻǮÅADZÇÃñ‚ëËÇÕ CFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…âeãøÇó^ǶÇÈÇæÇØÇ≈ÅAMach-O ÉxÅ[ÉXÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÕâeãøÇÕdžÇËÇ‹ÇπÇÒÅBÇ‹ÇΩÅADZÇÍÇÁÇÃä÷êîÇÕ Mac OS X 10.2 à»ç~DžǮǢǃÇÕê≥ǵÇ≠ÉGÉNÉXÉ|Å[ÉgÇ≥ÇÍǃǢNjÇ∑ÅBÇΩÇæÇµÅAMac OS v10.1x ÇΔÇÃå›ä∑ê´Çï€Ç¬ÇΩÇflÇ…ÅAÉGÉìÉgÉäÉ|ÉCÉìÉgÇìÆìIÇ…í≤Ç◊ÇΩÇ¢ÇΔǢǧDZÇΔLJçlǶÇÁÇÍÇ‹Ç∑ÅBOpenGL ä÷êîÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇÃìÆìIÇ»åüèoÇÃè⁄ç◊DžǬǢǃÇÕÅAãLéñ 1188ÅFOpenGL Entry Points and GetProcAddress ÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

ÉäÉXÉg 1 Ç…ÅACFM ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃé¿çséûÇ…ÉGÉNÉXÉ|Å[ÉgÇ≥ÇÍǃǢǻǢëSÉGÉìÉgÉäÉ|ÉCÉìÉgÇé¶ÇµÇ‹Ç∑ÅBDZÇÍÇÁÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇÕÅAMac OS X 10.1.x DžǮǢǃìÆìIÇ…åüèoÇµÇ»ÇØÇÍnjǻÇÁǻǢLJÇÃÇ≈Ç∑ÅB


OpenGL 1.2:
  • glBlendColor
  • glBlendEquation
  • glDrawRangeElements
  • glTexImage3D
  • glTexSubImage3D
  • glCopyTexSubImage3D
OpenGL 1.3:
  • glLoadTransposeMatrixf
  • glLoadTransposeMatrixd
  • glMultTransposeMatrixf
  • glMultTransposeMatrixd
  • glActiveTexture
  • glClientActiveTexture
  • glMultiTexCoord1d
  • glMultiTexCoord1dv
  • glMultiTexCoord1f
  • glMultiTexCoord1fv
  • glMultiTexCoord1i
  • glMultiTexCoord1iv
  • glMultiTexCoord1s
  • glMultiTexCoord1sv
  • glMultiTexCoord2d
  • glMultiTexCoord2dv
  • glMultiTexCoord2f
  • glMultiTexCoord2fv
  • glMultiTexCoord2i
  • glMultiTexCoord2iv
  • glMultiTexCoord2s
  • glMultiTexCoord2sv
  • glMultiTexCoord3d
  • glMultiTexCoord3dv
  • glMultiTexCoord3f
  • glMultiTexCoord3fv
  • glMultiTexCoord3i
  • glMultiTexCoord3iv
  • glMultiTexCoord3s
  • glMultiTexCoord3sv
  • glMultiTexCoord4d
  • glMultiTexCoord4dv
  • glMultiTexCoord4f
  • glMultiTexCoord4fv
  • glMultiTexCoord4i
  • glMultiTexCoord4iv
  • glMultiTexCoord4s
  • glMultiTexCoord4sv
  • glCompressedTexImage3D
  • glCompressedTexImage2D
  • glCompressedTexImage1D
  • glCompressedTexSubImage3D
  • glCompressedTexSubImage2D
  • glCompressedTexSubImage1D
  • glGetCompressedTexImage
  • glSampleCoverage
  • glSamplePass
GLU:
  • gluNurbsCallbackDataEXT
GL_ARB_transpose_matrix:
  • glLoadTransposeMatrixfARB
  • glLoadTransposeMatrixdARB
  • glMultTransposeMatrixfARB
  • glMultTransposeMatrixdARB
GL_ARB_texture_compression:
  • glCompressedTexImage3DARB
  • glCompressedTexImage2DARB
  • glCompressedTexImage1DARB
  • glCompressedTexSubImage3DARB
  • glCompressedTexSubImage2DARB
  • glCompressedTexSubImage1DARB
  • glGetCompressedTexImageARB
GL_ARB_multisample:
  • glSampleCoverageARB
  • glSamplePassARB
GL_EXT_paletted_texture:
  • glColorTableEXT
  • glColorSubTableEXT
  • glGetColorTableEXT
  • glGetColorTableParameterivEXT
  • glGetColorTableParameterfvEXT
GL_EXT_secondary_color:
  • glSecondaryColor3bEXT
  • glSecondaryColor3bvEXT
  • glSecondaryColor3dEXT
  • glSecondaryColor3dvEXT
  • glSecondaryColor3fEXT
  • glSecondaryColor3fvEXT
  • glSecondaryColor3iEXT
  • glSecondaryColor3ivEXT
  • glSecondaryColor3sEXT
  • glSecondaryColor3svEXT
  • glSecondaryColor3ubEXT
  • glSecondaryColor3ubvEXT
  • glSecondaryColor3uiEXT
  • glSecondaryColor3uivEXT
  • glSecondaryColor3usEXT
  • glSecondaryColor3usvEXT
  • glSecondaryColorPointerEXT
GL_ATIX_pn_triangles:
  • glPNTrianglesiATIX
  • glPNTrianglesfATIX
GL_NV_register_combiners:
  • glCombinerParameterfvNV
  • glCombinerParameterfNV
  • glCombinerParameterivNV
  • glCombinerParameteriNV
  • glCombinerInputNV
  • glCombinerOutputNV
  • glFinalCombinerInputNV
  • glGetCombinerInputParameterfvNV
  • glGetCombinerInputParameterivNV
  • glGetCombinerOutputParameterfvNV
  • glGetCombinerOutputParameterivNV
  • glGetFinalCombinerInputParameterfvNV
  • glGetFinalCombinerInputParameterivNV

ÉäÉXÉg 1. Mac OS X 10.1.x DžǻǢ CFM ÉGÉìÉgÉäÉ|ÉCÉìÉg


ÉäÉXÉg 2 Ç…ÅAãLéñ 1188ÅFOpenGL Entry Points and GetProcAddress ÇÃéËñ@ÇégópǵǃÅAé©ìÆìIÇ…åüèoÇ≥ÇÍǻǢ CFM ä÷êîÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇÃåüèoï˚ñ@ÇΔåƒÇ—èoǵï˚ñ@Çé¶ÇµÇ‹Ç∑ÅB


#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <OpenGL/glext.h>
#include <Carbon/Carbon.h>

 // AGL ópÇÃÉvÉçÉVÅ[ÉWÉÉÉ|ÉCÉìÉ^ÇéÊìæÇ∑ÇÈÉRÅ[Éh

CFBundleRef gBundleRefOpenGL = NULL;

OSStatus aglInitEntryPoints (void);
void aglDellocEntryPoints (void);
void * aglGetProcAddress (char *  pszProc);

// -------------------------

OSStatus aglInitEntryPoints (void)
{

    OSStatus err = noErr;
    const Str255 frameworkName = "\pOpenGL.framework";
    FSRefParam fileRefParam;
    FSRef fileRef;
    CFURLRef bundleURLOpenGL;

    memset(&fileRefParam, 0, sizeof(fileRefParam));
    memset(&fileRef, 0, sizeof(fileRef));

    fileRefParam.ioNamePtr  = frameworkName;
    fileRefParam.newRef = &fileRef;

    // ÅuFrameworksÅvÉfÉBÉåÉNÉgÉäÅ^ÉtÉHÉãÉ_
    err = FindFolder (kSystemDomain, kFrameworksFolderType, false,
                      &fileRefParam.ioVRefNum, &fileRefParam.ioDirID);
    if (noErr != err) {
        DebugStr ("\pCould not find frameworks folder");
        return err;
    }
    err = PBMakeFSRefSync (&fileRefParam); // ÉtÉHÉãÉ_ópÇà FSRef ç\ë¢ëÃçÏê¨
    if (noErr != err) {
        DebugStr ("\pCould make FSRef to frameworks folder");
        return err;
    }
    // ÉtÉHÉãÉ_Ç÷Çà URL ÇçÏê¨Ç∑ÇÈ
    bundleURLOpenGL = CFURLCreateFromFSRef (kCFAllocatorDefault,
                                            &fileRef);
    if (!bundleURLOpenGL) {
        DebugStr ("\pCould create OpenGL Framework bundle URL");
        return paramErr;
    }
    // GL ÇÃÉoÉìÉhÉãÇ÷Çà Ref ÇçÏê¨Ç∑ÇÈ
    gBundleRefOpenGL = CFBundleCreate (kCFAllocatorDefault,
                                       bundleURLOpenGL);
    if (!gBundleRefOpenGL) {
        DebugStr ("\pCould not create OpenGL Framework bundle");
        return paramErr;
    }
    CFRelease (bundleURLOpenGL); // çÏê¨ÇµÇΩÉoÉìÉhÉãÇâï˙Ç∑ÇÈ
    // ÉoÉìÉhÉãÇÃÉRÅ[ÉhÇê≥ǵÇ≠ÉçÅ[ÉhÇ≈Ç´ÇΩÇÁÅAÉtÉ@ÉìÉNÉVÉáÉìÇíTÇ∑
    if (!CFBundleLoadExecutable (gBundleRefOpenGL)) {
        DebugStr ("\pCould not load MachO executable");
        return paramErr;
    }
    return err;
}

// -------------------------

void aglDellocEntryPoints (void)
{
    if (gBundleRefOpenGL != NULL) {
        // ÉoÉìÉhÉãÇÃÉRÅ[ÉhÇÉAÉìÉçÅ[ÉhÇ∑ÇÈ
        CFBundleUnloadExecutable (gBundleRefOpenGL);
        CFRelease (gBundleRefOpenGL);
        gBundleRefOpenGL = NULL;
    }
}

// -------------------------

void * aglGetProcAddress (char * pszProc)
{
    return CFBundleGetFunctionPointerForName (gBundleRefOpenGL,
                CFStringCreateWithCStringNoCopy (NULL,
                     pszProc, CFStringGetSystemEncoding (), NULL));
}


// ==========================

// ì¡íËÇÃé∏ÇÌÇÍÇΩÉGÉìÉgÉäÉ|ÉCÉìÉgÇÉTÉ|Å[ÉgÇ∑ÇÈÉRÅ[Éh

static OSStatus InitMissingCFMEntryPoints (void);
static void DeallocMissingCFMEntryPoints (void);

// ÉtÉ@ÉìÉNÉVÉáÉìÉ|ÉCÉìÉ^Ç typedef Ç≈íËã`Ç∑ÇÈ

  // OpenGL 1.2
typedef void
    (*glBlendColorProcPtr)(GLclampf red, GLclampf green,
                           GLclampf blue, GLclampf alpha);
typedef void
    (*glBlendEquationProcPtr)(GLenum mode);
typedef void
    (*glDrawRangeElementsProcPtr)(GLenum mode, GLuint start,
         GLuint end, GLsizei count, GLenum type,
         const GLvoid *indices);
typedef void
    (*glTexImage3DProcPtr)(GLenum target, GLint level,
        GLenum internalFormat, GLsizei width, GLsizei height,
        GLsizei depth, GLint border, GLenum format, GLenum type,
        const GLvoid *pixels);
typedef void
    (*glTexSubImage3DProcPtr)(GLenum target, GLint level,
        GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,
        GLsizei height, GLsizei depth, GLenum format, GLenum type,
        const GLvoid *pixels);
typedef void
    (*glCopyTexSubImage3DProcPtr)(GLenum target, GLint level,
        GLint xoffset, GLint yoffset, GLint zoffset,
        GLint x, GLint y, GLsizei width, GLsizei height);

  // OpenGL 1.3
typedef void
    (*glLoadTransposeMatrixfProcPtr)(const GLfloat *);
typedef void
    (*glLoadTransposeMatrixdProcPtr)(const GLdouble *);
typedef void
    (*glMultTransposeMatrixfProcPtr)(const GLfloat *);
typedef void
    (*glMultTransposeMatrixdProcPtr)(const GLdouble *);
typedef void
    (*glActiveTextureProcPtr) (GLenum);
typedef void
    (*glClientActiveTextureProcPtr)(GLenum);
typedef void
    (*glMultiTexCoord1dProcPtr)(GLenum, GLdouble);
typedef void
    (*glMultiTexCoord1dvProcPtr)(GLenum, const GLdouble *);
typedef void
    (*glMultiTexCoord1fProcPtr)(GLenum, GLfloat);
typedef void
    (*glMultiTexCoord1fvProcPtr)(GLenum, const GLfloat *);
typedef void
    (*glMultiTexCoord1iProcPtr)(GLenum, GLint);
typedef void
    (*glMultiTexCoord1ivProcPtr)(GLenum, const GLint *);
typedef void
    (*glMultiTexCoord1sProcPtr)(GLenum, GLshort);
typedef void
    (*glMultiTexCoord1svProcPtr)(GLenum, const GLshort *);
typedef void
    (*glMultiTexCoord2dProcPtr)(GLenum, GLdouble, GLdouble);
typedef void
    (*glMultiTexCoord2dvProcPtr)(GLenum, const GLdouble *);
typedef void
    (*glMultiTexCoord2fProcPtr)(GLenum, GLfloat, GLfloat);
typedef void
    (*glMultiTexCoord2fvProcPtr)(GLenum, const GLfloat *);
typedef void
    (*glMultiTexCoord2iProcPtr)(GLenum, GLint, GLint);
typedef void
    (*glMultiTexCoord2ivProcPtr)(GLenum, const GLint *);
typedef void
    (*glMultiTexCoord2sProcPtr)(GLenum, GLshort, GLshort);
typedef void
    (*glMultiTexCoord2svProcPtr)(GLenum, const GLshort *);
typedef void
    (*glMultiTexCoord3dProcPtr)(GLenum, GLdouble, GLdouble,
        GLdouble);
typedef void
    (*glMultiTexCoord3dvProcPtr)(GLenum, const GLdouble *);
typedef void
    (*glMultiTexCoord3fProcPtr)(GLenum, GLfloat, GLfloat, GLfloat);
typedef void
    (*glMultiTexCoord3fvProcPtr)(GLenum, const GLfloat *);
typedef void
    (*glMultiTexCoord3iProcPtr)(GLenum, GLint, GLint, GLint);
typedef void
    (*glMultiTexCoord3ivProcPtr)(GLenum, const GLint *);
typedef void
    (*glMultiTexCoord3sProcPtr)(GLenum, GLshort, GLshort, GLshort);
typedef void
    (*glMultiTexCoord3svProcPtr)(GLenum, const GLshort *);
typedef void
    (*glMultiTexCoord4dProcPtr)(GLenum, GLdouble, GLdouble,
        GLdouble, GLdouble);
typedef void
    (*glMultiTexCoord4dvProcPtr)(GLenum, const GLdouble *);
typedef void
    (*glMultiTexCoord4fProcPtr)(GLenum, GLfloat, GLfloat, GLfloat,
        GLfloat);
typedef void
    (*glMultiTexCoord4fvProcPtr)(GLenum, const GLfloat *);
typedef void
    (*glMultiTexCoord4iProcPtr)(GLenum, GLint, GLint, GLint, GLint);
typedef void
    (*glMultiTexCoord4ivProcPtr)(GLenum, const GLint *);
typedef void
    (*glMultiTexCoord4sProcPtr)(GLenum, GLshort, GLshort, GLshort,
        GLshort);
typedef void
    (*glMultiTexCoord4svProcPtr)(GLenum, const GLshort *);
typedef void
    (*glCompressedTexImage3DProcPtr)(GLenum, GLint, GLenum, GLsizei,
        GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
typedef void
    (*glCompressedTexImage2DProcPtr)(GLenum, GLint, GLenum, GLsizei,
        GLsizei, GLint, GLsizei, const GLvoid *);
typedef void
    (*glCompressedTexImage1DProcPtr)(GLenum, GLint, GLenum, GLsizei,
        GLint, GLsizei, const GLvoid *);
typedef void
    (*glCompressedTexSubImage3DProcPtr)(GLenum, GLint, GLint, GLint,
        GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei,
        const GLvoid *);
typedef void
    (*glCompressedTexSubImage2DProcPtr)(GLenum, GLint, GLint, GLint,
        GLsizei, GLsizei, GLenum, GLsizei, const GLvoid *);
typedef void
    (*glCompressedTexSubImage1DProcPtr)(GLenum, GLint, GLint,
        GLsizei, GLenum, GLsizei, const GLvoid *);
typedef void
    (*glGetCompressedTexImageProcPtr)(GLenum, GLint, void *);
typedef void
    (*glSampleCoverageProcPtr)(GLclampf, GLboolean);
typedef void
    (*glSamplePassProcPtr)(GLenum);


  // glu ä÷êî
typedef void
    (*gluNurbsCallbackDataEXTProcPtr)(GLUnurbs* nurb,
        GLvoid* userData);

  // GL_ARB_transpose_matrix
typedef void
    (*glLoadTransposeMatrixfARBProcPtr)(const GLfloat *m);
typedef void
    (*glLoadTransposeMatrixdARBProcPtr)(const GLdouble *m);
typedef void
    (*glMultTransposeMatrixfARBProcPtr)(const GLfloat *m);
typedef void
    (*glMultTransposeMatrixdARBProcPtr)(const GLdouble *m);

  // GL_ARB_texture_compression
typedef void
    (*glCompressedTexImage3DARBProcPtr)(GLenum target, GLint level,
        GLenum internalformat, GLsizei width, GLsizei height,
        GLsizei depth, GLint border, GLsizei imageSize,
        const GLvoid *data);
typedef void
    (*glCompressedTexImage2DARBProcPtr)(GLenum target, GLint level,
        GLenum internalformat, GLsizei width, GLsizei height,
        GLint border, GLsizei imageSize, const GLvoid *data);
typedef void
    (*glCompressedTexImage1DARBProcPtr)(GLenum target, GLint level,
        GLenum internalformat, GLsizei width, GLint border,
        GLsizei imageSize, const GLvoid *data);
typedef void
    (*glCompressedTexSubImage3DARBProcPtr)(GLenum target,
        GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
        GLsizei width, GLsizei height, GLsizei depth, GLenum format,
        GLsizei imageSize, const GLvoid *data);
typedef void
    (*glCompressedTexSubImage2DARBProcPtr)(GLenum target,
        GLint level, GLint xoffset, GLint yoffset, GLsizei width,
        GLsizei height, GLenum format, GLsizei imageSize,
        const GLvoid *data);
typedef void

    (*glCompressedTexSubImage1DARBProcPtr)(GLenum target,
        GLint level, GLint xoffset, GLsizei width, GLenum format,
        GLsizei imageSize, const GLvoid *data);
typedef void
    (*glGetCompressedTexImageARBProcPtr)(GLenum target, GLint level,
        void *img);

  // GL_ARB_multisample
typedef void
    (*glSampleCoverageARBProcPtr)(GLclampf value, GLboolean invert);
typedef void
    (*glSamplePassARBProcPtr)(GLenum mode);

  // GL_EXT_paletted_texture
typedef void
    (*glColorTableEXTProcPtr)(GLenum target, GLenum internalformat,
        GLsizei width, GLenum format,  GLenum type,
        const GLvoid *table);
typedef void
    (*glColorSubTableEXTProcPtr)(GLenum target, GLsizei start,
        GLsizei count, GLenum format, GLenum type,
        const GLvoid *data);
typedef void
    (*glGetColorTableEXTProcPtr)(GLenum target, GLenum format,
        GLenum type, GLvoid *table);
typedef void
    (*glGetColorTableParameterfvEXTProcPtr)(GLenum target,
        GLenum pname, GLfloat *params);
typedef void
    (*glGetColorTableParameterivEXTProcPtr)(GLenum target,
        GLenum pname, GLint *params);

  // GL_EXT_secondary_color
typedef void
    (*glSecondaryColor3bEXTProcPtr)(GLbyte red, GLbyte green,
        GLbyte blue);
typedef void
    (*glSecondaryColor3bvEXTProcPtr)(const GLbyte *v);
typedef void
    (*glSecondaryColor3dEXTProcPtr)(GLdouble red, GLdouble green,
        GLdouble blue);
typedef void
    (*glSecondaryColor3dvEXTProcPtr)(const GLdouble *v);
typedef void
    (*glSecondaryColor3fEXTProcPtr)(GLfloat red, GLfloat green,
        GLfloat blue);
typedef void
    (*glSecondaryColor3fvEXTProcPtr)(const GLfloat *v);
typedef void
    (*glSecondaryColor3iEXTProcPtr)(GLint red, GLint green,
        GLint blue);
typedef void
    (*glSecondaryColor3ivEXTProcPtr)(const GLint *v);
typedef void
    (*glSecondaryColor3sEXTProcPtr)(GLshort red, GLshort green,
        GLshort blue);
typedef void
    (*glSecondaryColor3svEXTProcPtr)(const GLshort *v);
typedef void
    (*glSecondaryColor3ubEXTProcPtr)(GLubyte red, GLubyte green,
        GLubyte blue);
typedef void
    (*glSecondaryColor3ubvEXTProcPtr)(const GLubyte *v);
typedef void
    (*glSecondaryColor3uiEXTProcPtr)(GLuint red, GLuint green,
        GLuint blue);
typedef void
    (*glSecondaryColor3uivEXTProcPtr)(const GLuint *v);
typedef void
    (*glSecondaryColor3usEXTProcPtr)(GLushort red, GLushort green,
        GLushort blue);
typedef void
    (*glSecondaryColor3usvEXTProcPtr)(const GLushort *v);
typedef void
    (*glSecondaryColorPointerEXTProcPtr)(GLint size, GLenum type,
        GLsizei stride, GLvoid *pointer);

  // GL_ATIX_pn_triangles
typedef void
    (*glPNTrianglesiATIXProcPtr)(GLenum pname, GLint param);
typedef void
    (*glPNTrianglesfATIXProcPtr)(GLenum pname, GLfloat param);

  //  GL_NV_register_combiners
typedef void
    (*glCombinerParameterfvNVProcPtr)(GLenum pname,
        const GLfloat *params);
typedef void
    (*glCombinerParameterfNVProcPtr)(GLenum pname, GLfloat param);
typedef void
    (*glCombinerParameterivNVProcPtr)(GLenum pname,
        const GLint *params);
typedef void
    (*glCombinerParameteriNVProcPtr)(GLenum pname, GLint param);
typedef void
    (*glCombinerInputNVProcPtr)(GLenum stage, GLenum portion,
        GLenum variable, GLenum input, GLenum mapping,
        GLenum componentUsage);
typedef void
    (*glCombinerOutputNVProcPtr)(GLenum stage, GLenum portion,
        GLenum abOutput, GLenum cdOutput, GLenum sumOutput,
        GLenum scale, GLenum bias, GLboolean abDotProduct,
        GLboolean cdDotProduct, GLboolean muxSum);
typedef void
    (*glFinalCombinerInputNVProcPtr)(GLenum variable, GLenum input,
        GLenum mapping, GLenum componentUsage);
typedef void
    (*glGetCombinerInputParameterfvNVProcPtr)(GLenum stage,
        GLenum portion, GLenum variable, GLenum pname,
        GLfloat *params);
typedef void
    (*glGetCombinerInputParameterivNVProcPtr)(GLenum stage,
        GLenum portion, GLenum variable, GLenum pname, GLint *params);
typedef void
    (*glGetCombinerOutputParameterfvNVProcPtr)(GLenum stage,
        GLenum portion, GLenum pname, GLfloat *params);
typedef void
    (*glGetCombinerOutputParameterivNVProcPtr)(GLenum stage,
        GLenum portion, GLenum pname, GLint *params);
typedef void
    (*glGetFinalCombinerInputParameterfvNVProcPtr)(GLenum variable,
        GLenum pname, GLfloat *params);
typedef void
    (*glGetFinalCombinerInputParameterivNVProcPtr)(GLenum variable,
        GLenum pname, GLint *params);
// ÉtÉ@ÉìÉNÉVÉáÉìÉ|ÉCÉìÉ^êÈåæ
// íçà”ÅFê≥ämÇ»ÉGÉìÉgÉäÉ|ÉCÉìÉgñºÇégópÇ≈Ç´ÇÈÇ™ÅAMac OS X 10.2 à»ç~
//       Ç≈ÇÕÅAëŒâûÇ∑ÇÈíËã`çœÇ›ÇÃÉVÉìÉ{ÉãÇ™ï°êîë∂ç›Ç∑ÇÈÅB
//       pfXXX ÇÕÅAÅuÉtÉ@ÉìÉNÉVÉáÉìÇ÷ÇÃÉ|ÉCÉìÉ^ÅvÇ
//       ï\Ç∑è»ó™å`ÇΔǵǃëIÇÒÇæ

  // OpenGL 1.2
glBlendColorProcPtr pfglBlendColor = NULL;
glBlendEquationProcPtr pfglBlendEquation = NULL;
glDrawRangeElementsProcPtr pfglDrawRangeElements  = NULL;
glTexImage3DProcPtr pfglTexImage3D = NULL;
glTexSubImage3DProcPtr pfglTexSubImage3D = NULL;
glCopyTexSubImage3DProcPtr pfglCopyTexSubImage3D = NULL;

  // OpenGL 1.3
glLoadTransposeMatrixfProcPtr pfglLoadTransposeMatrixf = NULL;
glLoadTransposeMatrixdProcPtr pfglLoadTransposeMatrixd = NULL;
glMultTransposeMatrixfProcPtr pfglMultTransposeMatrixf = NULL;
glMultTransposeMatrixdProcPtr pfglMultTransposeMatrixd = NULL;
glActiveTextureProcPtr pfglActiveTexture = NULL;
glClientActiveTextureProcPtr pfglClientActiveTexture = NULL;
glMultiTexCoord1dProcPtr pfglMultiTexCoord1d = NULL;
glMultiTexCoord1dvProcPtr pfglMultiTexCoord1dv = NULL;
glMultiTexCoord1fProcPtr pfglMultiTexCoord1f = NULL;
glMultiTexCoord1fvProcPtr pfglMultiTexCoord1fv = NULL;
glMultiTexCoord1iProcPtr pfglMultiTexCoord1i = NULL;
glMultiTexCoord1ivProcPtr pfglMultiTexCoord1iv = NULL;
glMultiTexCoord1sProcPtr pfglMultiTexCoord1s = NULL;
glMultiTexCoord1svProcPtr pfglMultiTexCoord1sv = NULL;
glMultiTexCoord2dProcPtr pfglMultiTexCoord2d = NULL;
glMultiTexCoord2dvProcPtr pfglMultiTexCoord2dv = NULL;
glMultiTexCoord2fProcPtr pfglMultiTexCoord2f = NULL;
glMultiTexCoord2fvProcPtr pfglMultiTexCoord2fv = NULL;
glMultiTexCoord2iProcPtr pfglMultiTexCoord2i = NULL;
glMultiTexCoord2ivProcPtr pfglMultiTexCoord2iv = NULL;
glMultiTexCoord2sProcPtr pfglMultiTexCoord2s = NULL;
glMultiTexCoord2svProcPtr pfglMultiTexCoord2sv = NULL;
glMultiTexCoord3dProcPtr pfglMultiTexCoord3d = NULL;
glMultiTexCoord3dvProcPtr pfglMultiTexCoord3dv = NULL;
glMultiTexCoord3fProcPtr pfglMultiTexCoord3f = NULL;
glMultiTexCoord3fvProcPtr pfglMultiTexCoord3fv = NULL;
glMultiTexCoord3iProcPtr pfglMultiTexCoord3i = NULL;
glMultiTexCoord3ivProcPtr pfglMultiTexCoord3iv = NULL;
glMultiTexCoord3sProcPtr pfglMultiTexCoord3s = NULL;
glMultiTexCoord3svProcPtr pfglMultiTexCoord3sv = NULL;
glMultiTexCoord4dProcPtr pfglMultiTexCoord4d = NULL;
glMultiTexCoord4dvProcPtr pfglMultiTexCoord4dv = NULL;
glMultiTexCoord4fProcPtr pfglMultiTexCoord4f = NULL;
glMultiTexCoord4fvProcPtr pfglMultiTexCoord4fv = NULL;
glMultiTexCoord4iProcPtr pfglMultiTexCoord4i = NULL;
glMultiTexCoord4ivProcPtr pfglMultiTexCoord4iv = NULL;
glMultiTexCoord4sProcPtr pfglMultiTexCoord4s = NULL;
glMultiTexCoord4svProcPtr pfglMultiTexCoord4sv = NULL;
glCompressedTexImage3DProcPtr pfglCompressedTexImage3D = NULL;
glCompressedTexImage2DProcPtr pfglCompressedTexImage2D = NULL;
glCompressedTexImage1DProcPtr pfglCompressedTexImage1D = NULL;
glCompressedTexSubImage3DProcPtr pfglCompressedTexSubImage3D = NULL;
glCompressedTexSubImage2DProcPtr pfglCompressedTexSubImage2D = NULL;
glCompressedTexSubImage1DProcPtr pfglCompressedTexSubImage1D = NULL;
glGetCompressedTexImageProcPtr pfglGetCompressedTexImage = NULL;
glSampleCoverageProcPtr pfglSampleCoverage = NULL;
glSamplePassProcPtr pfglSamplePass = NULL;

  // glu ä÷êî
gluNurbsCallbackDataEXTProcPtr pfgluNurbsCallbackDataEXT = NULL;

  // GL_ARB_transpose_matrix
glLoadTransposeMatrixfARBProcPtr pfglLoadTransposeMatrixfARB = NULL;
glLoadTransposeMatrixdARBProcPtr pfglLoadTransposeMatrixdARB = NULL;
glMultTransposeMatrixfARBProcPtr pfglMultTransposeMatrixfARB = NULL;
glMultTransposeMatrixdARBProcPtr pfglMultTransposeMatrixdARB = NULL;

  // GL_ARB_texture_compression
glCompressedTexImage3DARBProcPtr pfglCompressedTexImage3DARB = NULL;
glCompressedTexImage2DARBProcPtr pfglCompressedTexImage2DARB = NULL;
glCompressedTexImage1DARBProcPtr pfglCompressedTexImage1DARB = NULL;
glCompressedTexSubImage3DARBProcPtr
    pfglCompressedTexSubImage3DARB = NULL;
glCompressedTexSubImage2DARBProcPtr
    pfglCompressedTexSubImage2DARB = NULL;
glCompressedTexSubImage1DARBProcPtr
    pfglCompressedTexSubImage1DARB = NULL;
glGetCompressedTexImageARBProcPtr
    pfglGetCompressedTexImageARB = NULL;

  // GL_ARB_multisample
glSampleCoverageARBProcPtr pfglSampleCoverageARB = NULL;
glSamplePassARBProcPtr pfglSamplePassARB = NULL;

  // GL_EXT_paletted_texture
glColorTableEXTProcPtr pfglColorTableEXT = NULL;
glColorSubTableEXTProcPtr pfglColorSubTableEXT = NULL;
glGetColorTableEXTProcPtr pfglGetColorTableEXT = NULL;
glGetColorTableParameterivEXTProcPtr
    pfglGetColorTableParameterivEXT = NULL;
glGetColorTableParameterfvEXTProcPtr
    pfglGetColorTableParameterfvEXT = NULL;

  // GL_EXT_secondary_color
glSecondaryColor3bEXTProcPtr pfglSecondaryColor3bEXT = NULL;
glSecondaryColor3bvEXTProcPtr pfglSecondaryColor3bvEXT = NULL;
glSecondaryColor3dEXTProcPtr pfglSecondaryColor3dEXT = NULL;
glSecondaryColor3dvEXTProcPtr pfglSecondaryColor3dvEXT = NULL;
glSecondaryColor3fEXTProcPtr pfglSecondaryColor3fEXT = NULL;
glSecondaryColor3fvEXTProcPtr pfglSecondaryColor3fvEXT = NULL;
glSecondaryColor3iEXTProcPtr pfglSecondaryColor3iEXT = NULL;
glSecondaryColor3ivEXTProcPtr pfglSecondaryColor3ivEXT = NULL;
glSecondaryColor3sEXTProcPtr pfglSecondaryColor3sEXT = NULL;
glSecondaryColor3svEXTProcPtr pfglSecondaryColor3svEXT = NULL;
glSecondaryColor3ubEXTProcPtr pfglSecondaryColor3ubEXT = NULL;
glSecondaryColor3ubvEXTProcPtr pfglSecondaryColor3ubvEXT = NULL;
glSecondaryColor3uiEXTProcPtr pfglSecondaryColor3uiEXT = NULL;
glSecondaryColor3uivEXTProcPtr pfglSecondaryColor3uivEXT = NULL;
glSecondaryColor3usEXTProcPtr pfglSecondaryColor3usEXT = NULL;
glSecondaryColor3usvEXTProcPtr pfglSecondaryColor3usvEXT = NULL;
glSecondaryColorPointerEXTProcPtr
    pfglSecondaryColorPointerEXT = NULL;

  // GL_ATIX_pn_triangles
glPNTrianglesiATIXProcPtr pfglPNTrianglesiATIX = NULL;
glPNTrianglesfATIXProcPtr pfglPNTrianglesfATIX = NULL;

  //  GL_NV_register_combiners
glCombinerParameterfvNVProcPtr pfglCombinerParameterfvNV = NULL;
glCombinerParameterfNVProcPtr pfglCombinerParameterfNV = NULL;
glCombinerParameterivNVProcPtr pfglCombinerParameterivNV = NULL;
glCombinerParameteriNVProcPtr pfglCombinerParameteriNV = NULL;
glCombinerInputNVProcPtr pfglCombinerInputNV = NULL;
glCombinerOutputNVProcPtr pfglCombinerOutputNV = NULL;
glFinalCombinerInputNVProcPtr pfglFinalCombinerInputNV = NULL;
glGetCombinerInputParameterfvNVProcPtr
    pfglGetCombinerInputParameterfvNV = NULL;
glGetCombinerInputParameterivNVProcPtr
        pfglGetCombinerInputParameterivNV = NULL;
glGetCombinerOutputParameterfvNVProcPtr
    pfglGetCombinerOutputParameterfvNV = NULL;
glGetCombinerOutputParameterivNVProcPtr
    pfglGetCombinerOutputParameterivNV = NULL;
glGetFinalCombinerInputParameterfvNVProcPtr
    pfglGetFinalCombinerInputParameterfvNV = NULL;
glGetFinalCombinerInputParameterivNVProcPtr
    pfglGetFinalCombinerInputParameterivNV = NULL;

// -------------------------

static OSStatus InitMissingCFMEntryPoints (void)
{
    OSStatus err = aglInitEntryPoints (); // ÉoÉìÉhÉãÇÃèâä˙âª
    if (noErr == err) {
        pfglBlendColor = (glBlendColorProcPtr)
                aglGetProcAddress ("glBlendColor");
        pfglBlendEquation = (glBlendEquationProcPtr)
                aglGetProcAddress("glBlendEquation");
        pfglDrawRangeElements = (glDrawRangeElementsProcPtr)
                aglGetProcAddress("glDrawRangeElements");
        pfglTexImage3D = (glTexImage3DProcPtr)
                aglGetProcAddress ("glTexImage3D");
        pfglTexSubImage3D = (glTexSubImage3DProcPtr)
                aglGetProcAddress ("glTexSubImage3D");
        pfglCopyTexSubImage3D = (glCopyTexSubImage3DProcPtr)
                aglGetProcAddress ("glCopyTexSubImage3D");
        pfglLoadTransposeMatrixf = (glLoadTransposeMatrixfProcPtr)
                aglGetProcAddress ("glLoadTransposeMatrixf");
        pfglLoadTransposeMatrixd = (glLoadTransposeMatrixdProcPtr)
                aglGetProcAddress ("glLoadTransposeMatrixd");
        pfglMultTransposeMatrixf = (glMultTransposeMatrixfProcPtr)
                aglGetProcAddress ("glMultTransposeMatrixf");
        pfglMultTransposeMatrixd = (glMultTransposeMatrixdProcPtr)
                aglGetProcAddress ("glMultTransposeMatrixd");
        pfglActiveTexture = (glActiveTextureProcPtr)
                aglGetProcAddress ("glActiveTexture");
        pfglClientActiveTexture = (glClientActiveTextureProcPtr)
                aglGetProcAddress ("glClientActiveTexture");
        pfglMultiTexCoord1d = (glMultiTexCoord1dProcPtr)
                aglGetProcAddress ("glMultiTexCoord1d");
        pfglMultiTexCoord1dv = (glMultiTexCoord1dvProcPtr)
                aglGetProcAddress ("glMultiTexCoord1dv");
        pfglMultiTexCoord1f = (glMultiTexCoord1fProcPtr)
                aglGetProcAddress ("glMultiTexCoord1f");
        pfglMultiTexCoord1fv = (glMultiTexCoord1fvProcPtr)
                aglGetProcAddress ("glMultiTexCoord1fv");
        pfglMultiTexCoord1i = (glMultiTexCoord1iProcPtr)
                aglGetProcAddress ("glMultiTexCoord1i");
        pfglMultiTexCoord1iv = (glMultiTexCoord1ivProcPtr)
                aglGetProcAddress ("glMultiTexCoord1iv");
        pfglMultiTexCoord1s = (glMultiTexCoord1sProcPtr)
                aglGetProcAddress ("glMultiTexCoord1s");
        pfglMultiTexCoord1sv = (glMultiTexCoord1svProcPtr)
                aglGetProcAddress ("glMultiTexCoord1sv");
        pfglMultiTexCoord2d = (glMultiTexCoord2dProcPtr)
                aglGetProcAddress ("glMultiTexCoord2d");
        pfglMultiTexCoord2dv = (glMultiTexCoord2dvProcPtr)
                aglGetProcAddress ("glMultiTexCoord2dv");
        pfglMultiTexCoord2f = (glMultiTexCoord2fProcPtr)
                aglGetProcAddress ("glMultiTexCoord2f");
        pfglMultiTexCoord2fv = (glMultiTexCoord2fvProcPtr)
                aglGetProcAddress ("glMultiTexCoord2fv");
        pfglMultiTexCoord2i = (glMultiTexCoord2iProcPtr)
                aglGetProcAddress ("glMultiTexCoord2i");
        pfglMultiTexCoord2iv = (glMultiTexCoord2ivProcPtr)
                aglGetProcAddress ("glMultiTexCoord2iv");
        pfglMultiTexCoord2s = (glMultiTexCoord2sProcPtr)
                aglGetProcAddress ("glMultiTexCoord2s");
        pfglMultiTexCoord2sv = (glMultiTexCoord2svProcPtr)
                aglGetProcAddress ("glMultiTexCoord2sv");
        pfglMultiTexCoord3d = (glMultiTexCoord3dProcPtr)
                aglGetProcAddress ("glMultiTexCoord3d");
        pfglMultiTexCoord3dv = (glMultiTexCoord3dvProcPtr)
                aglGetProcAddress ("glMultiTexCoord3dv");
        pfglMultiTexCoord3f = (glMultiTexCoord3fProcPtr)
                aglGetProcAddress ("glMultiTexCoord3f");
        pfglMultiTexCoord3fv = (glMultiTexCoord3fvProcPtr)
                aglGetProcAddress ("glMultiTexCoord3fv");
        pfglMultiTexCoord3i = (glMultiTexCoord3iProcPtr)
                aglGetProcAddress ("glMultiTexCoord3i");
        pfglMultiTexCoord3iv = (glMultiTexCoord3ivProcPtr)
                aglGetProcAddress ("glMultiTexCoord3iv");
        pfglMultiTexCoord3s = (glMultiTexCoord3sProcPtr)
                aglGetProcAddress ("glMultiTexCoord3s");
        pfglMultiTexCoord3sv = (glMultiTexCoord3svProcPtr)
                aglGetProcAddress ("glMultiTexCoord3sv");
        pfglMultiTexCoord4d = (glMultiTexCoord4dProcPtr)
                aglGetProcAddress ("glMultiTexCoord4d");
        pfglMultiTexCoord4dv = (glMultiTexCoord4dvProcPtr)
                aglGetProcAddress ("glMultiTexCoord4dv");
        pfglMultiTexCoord4f = (glMultiTexCoord4fProcPtr)
                aglGetProcAddress ("glMultiTexCoord4f");
        pfglMultiTexCoord4fv = (glMultiTexCoord4fvProcPtr)
                aglGetProcAddress ("glMultiTexCoord4fv");
        pfglMultiTexCoord4i = (glMultiTexCoord4iProcPtr)
                aglGetProcAddress ("glMultiTexCoord4i");
        pfglMultiTexCoord4iv = (glMultiTexCoord4ivProcPtr)
                aglGetProcAddress ("glMultiTexCoord4iv");
        pfglMultiTexCoord4s = (glMultiTexCoord4sProcPtr)
                aglGetProcAddress ("glMultiTexCoord4s");
        pfglMultiTexCoord4sv = (glMultiTexCoord4svProcPtr)
                aglGetProcAddress ("glMultiTexCoord4sv");
        pfglCompressedTexImage3D = (glCompressedTexImage3DProcPtr)
                aglGetProcAddress ("glCompressedTexImage3D");
        pfglCompressedTexImage2D = (glCompressedTexImage2DProcPtr)
                aglGetProcAddress ("glCompressedTexImage2D");
        pfglCompressedTexImage1D = (glCompressedTexImage1DProcPtr)
                aglGetProcAddress ("glCompressedTexImage1D");
        pfglCompressedTexSubImage3D =
            (glCompressedTexSubImage3DProcPtr)
                aglGetProcAddress ("glCompressedTexSubImage3D");
        pfglCompressedTexSubImage2D =
            (glCompressedTexSubImage2DProcPtr)
                aglGetProcAddress ("glCompressedTexSubImage2D");
        pfglCompressedTexSubImage1D =
            (glCompressedTexSubImage1DProcPtr)
                aglGetProcAddress ("glCompressedTexSubImage1D");
        pfglGetCompressedTexImage = (glGetCompressedTexImageProcPtr)
                aglGetProcAddress ("glGetCompressedTexImage");
        pfglSampleCoverage = (glSampleCoverageProcPtr)
                aglGetProcAddress ("glSampleCoverage");
        pfglSamplePass = (glSamplePassProcPtr)
                aglGetProcAddress ("glSamplePass");
        pfgluNurbsCallbackDataEXT = (gluNurbsCallbackDataEXTProcPtr)
                aglGetProcAddress ("gluNurbsCallbackDataEXT");
        pfglLoadTransposeMatrixfARB =
            (glLoadTransposeMatrixfARBProcPtr)
                aglGetProcAddress ("glLoadTransposeMatrixfARB");
        pfglLoadTransposeMatrixdARB =
            (glLoadTransposeMatrixdARBProcPtr)
                aglGetProcAddress ("glLoadTransposeMatrixdARB");
        pfglMultTransposeMatrixfARB =
            (glMultTransposeMatrixfARBProcPtr)
                aglGetProcAddress ("glMultTransposeMatrixfARB");
        pfglMultTransposeMatrixdARB =
            (glMultTransposeMatrixdARBProcPtr)
                aglGetProcAddress ("glMultTransposeMatrixdARB");
        pfglCompressedTexImage3DARB =
            (glCompressedTexImage3DARBProcPtr)
                aglGetProcAddress ("glCompressedTexImage3DARB");
        pfglCompressedTexImage2DARB =
            (glCompressedTexImage2DARBProcPtr)
                aglGetProcAddress ("glCompressedTexImage2DARB");
        pfglCompressedTexImage1DARB =
            (glCompressedTexImage1DARBProcPtr)
                aglGetProcAddress ("glCompressedTexImage1DARB");
        pfglCompressedTexSubImage3DARB =
            (glCompressedTexSubImage3DARBProcPtr)
                aglGetProcAddress ("glCompressedTexSubImage3DARB");
        pfglCompressedTexSubImage2DARB =
            (glCompressedTexSubImage2DARBProcPtr)
                aglGetProcAddress ("glCompressedTexSubImage2DARB");
        pfglCompressedTexSubImage1DARB =
            (glCompressedTexSubImage1DARBProcPtr)
                aglGetProcAddress ("glCompressedTexSubImage1DARB");
        pfglGetCompressedTexImageARB =
            (glGetCompressedTexImageARBProcPtr)
                aglGetProcAddress ("glGetCompressedTexImageARB");
        pfglSampleCoverageARB = (glSampleCoverageARBProcPtr)
                aglGetProcAddress ("glSampleCoverageARB");
        pfglSamplePassARB = (glSamplePassARBProcPtr)
                aglGetProcAddress ("glSamplePassARB");
        pfglColorTableEXT = (glColorTableEXTProcPtr)
                aglGetProcAddress ("glColorTableEXT");
        pfglColorSubTableEXT = (glColorSubTableEXTProcPtr)
                aglGetProcAddress ("glColorSubTableEXT");
        pfglGetColorTableEXT = (glGetColorTableEXTProcPtr)
                aglGetProcAddress ("glGetColorTableEXT");
        pfglGetColorTableParameterivEXT =
            (glGetColorTableParameterivEXTProcPtr)
                aglGetProcAddress ("glGetColorTableParameterivEXT");
        pfglGetColorTableParameterfvEXT =
            (glGetColorTableParameterfvEXTProcPtr)
                aglGetProcAddress ("glGetColorTableParameterfvEXT");
        pfglSecondaryColor3bEXT = (glSecondaryColor3bEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3bEXT");
        pfglSecondaryColor3bvEXT = (glSecondaryColor3bvEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3bvEXT");
        pfglSecondaryColor3dEXT = (glSecondaryColor3dEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3dEXT");
        pfglSecondaryColor3dvEXT = (glSecondaryColor3dvEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3dvEXT");
        pfglSecondaryColor3fEXT = (glSecondaryColor3fEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3fEXT");
        pfglSecondaryColor3fvEXT = (glSecondaryColor3fvEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3fvEXT");
        pfglSecondaryColor3iEXT = (glSecondaryColor3iEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3iEXT");
        pfglSecondaryColor3ivEXT = (glSecondaryColor3ivEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3ivEXT");
        pfglSecondaryColor3sEXT = (glSecondaryColor3sEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3sEXT");
        pfglSecondaryColor3svEXT = (glSecondaryColor3svEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3svEXT");
        pfglSecondaryColor3ubEXT = (glSecondaryColor3ubEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3ubEXT");
        pfglSecondaryColor3ubvEXT = (glSecondaryColor3ubvEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3ubvEXT");
        pfglSecondaryColor3uiEXT = (glSecondaryColor3uiEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3uiEXT");
        pfglSecondaryColor3uivEXT = (glSecondaryColor3uivEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3uivEXT");
        pfglSecondaryColor3usEXT = (glSecondaryColor3usEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3usEXT");
        pfglSecondaryColor3usvEXT = (glSecondaryColor3usvEXTProcPtr)
                aglGetProcAddress ("glSecondaryColor3usvEXT");
        pfglSecondaryColorPointerEXT =
            (glSecondaryColorPointerEXTProcPtr)
                aglGetProcAddress ("glSecondaryColorPointerEXT");
        pfglPNTrianglesiATIX = (glPNTrianglesiATIXProcPtr)
                aglGetProcAddress ("glPNTrianglesiATIX");
        pfglPNTrianglesfATIX = (glPNTrianglesfATIXProcPtr)
                aglGetProcAddress ("glPNTrianglesfATIX");
        pfglCombinerParameterfvNV = (glCombinerParameterfvNVProcPtr)
                aglGetProcAddress ("glCombinerParameterfvNV");
        pfglCombinerParameterfNV = (glCombinerParameterfNVProcPtr)
                aglGetProcAddress ("glCombinerParameterfNV");
        pfglCombinerParameterivNV = (glCombinerParameterivNVProcPtr)
                aglGetProcAddress ("glCombinerParameterivNV");
        pfglCombinerParameteriNV = (glCombinerParameteriNVProcPtr)
                aglGetProcAddress ("glCombinerParameteriNV");
        pfglCombinerInputNV = (glCombinerInputNVProcPtr)
                aglGetProcAddress ("glCombinerInputNV");
        pfglCombinerOutputNV = (glCombinerOutputNVProcPtr)
                aglGetProcAddress ("glCombinerOutputNV");
        pfglFinalCombinerInputNV = (glFinalCombinerInputNVProcPtr)
                aglGetProcAddress ("glFinalCombinerInputNV");
        pfglGetCombinerInputParameterfvNV =
            (glGetCombinerInputParameterfvNVProcPtr)
                aglGetProcAddress ("glGetCombinerInputParameterfvNV");
        pfglGetCombinerInputParameterivNV =
            (glGetCombinerInputParameterivNVProcPtr)
                aglGetProcAddress ("glGetCombinerInputParameterivNV");
        pfglGetCombinerOutputParameterfvNV =
            (glGetCombinerOutputParameterfvNVProcPtr)
                aglGetProcAddress ("glGetCombinerOutputParameterfvNV");
        pfglGetCombinerOutputParameterivNV =
            (glGetCombinerOutputParameterivNVProcPtr)
                aglGetProcAddress ("glGetCombinerOutputParameterivNV");
        pfglGetFinalCombinerInputParameterfvNV =
            (glGetFinalCombinerInputParameterfvNVProcPtr)
                aglGetProcAddress
                    ("glGetFinalCombinerInputParameterfvNV");
        pfglGetFinalCombinerInputParameterivNV =
            (glGetFinalCombinerInputParameterivNVProcPtr)
                aglGetProcAddress
                    ("glGetFinalCombinerInputParameterivNV");
    }
    return err;
}

// -------------------------

static void DeallocMissingCFMEntryPoints (void)
{
    pfglBlendColor = NULL;
    pfglBlendEquation = NULL;
    pfglDrawRangeElements = NULL;;
    pfglTexImage3D = NULL;
    pfglTexSubImage3D = NULL;
    pfglCopyTexSubImage3D = NULL;
    pfglLoadTransposeMatrixf = NULL;
    pfglLoadTransposeMatrixd = NULL;
    pfglMultTransposeMatrixf = NULL;
    pfglMultTransposeMatrixd = NULL;
    pfglActiveTexture = NULL;
    pfglClientActiveTexture = NULL;
    pfglMultiTexCoord1d = NULL;
    pfglMultiTexCoord1dv = NULL;
    pfglMultiTexCoord1f = NULL;
    pfglMultiTexCoord1fv = NULL;
    pfglMultiTexCoord1i = NULL;
    pfglMultiTexCoord1iv = NULL;
    pfglMultiTexCoord1s = NULL;
    pfglMultiTexCoord1sv = NULL;
    pfglMultiTexCoord2d = NULL;
    pfglMultiTexCoord2dv = NULL;
    pfglMultiTexCoord2f = NULL;
    pfglMultiTexCoord2fv = NULL;
    pfglMultiTexCoord2i = NULL;
    pfglMultiTexCoord2iv = NULL;
    pfglMultiTexCoord2s = NULL;
    pfglMultiTexCoord2sv = NULL;
    pfglMultiTexCoord3d = NULL;
    pfglMultiTexCoord3dv = NULL;
    pfglMultiTexCoord3f = NULL;
    pfglMultiTexCoord3fv = NULL;
    pfglMultiTexCoord3i = NULL;
    pfglMultiTexCoord3iv = NULL;
    pfglMultiTexCoord3s = NULL;
    pfglMultiTexCoord3sv = NULL;
    pfglMultiTexCoord4d = NULL;
    pfglMultiTexCoord4dv = NULL;
    pfglMultiTexCoord4f = NULL;
    pfglMultiTexCoord4fv = NULL;
    pfglMultiTexCoord4i = NULL;
    pfglMultiTexCoord4iv = NULL;
    pfglMultiTexCoord4s = NULL;
    pfglMultiTexCoord4sv = NULL;
    pfglCompressedTexImage3D = NULL;
    pfglCompressedTexImage2D = NULL;
    pfglCompressedTexImage1D = NULL;
    pfglCompressedTexSubImage3D = NULL;
    pfglCompressedTexSubImage2D = NULL;
    pfglCompressedTexSubImage1D = NULL;
    pfglGetCompressedTexImage = NULL;
    pfglSampleCoverage = NULL;
    pfglSamplePass = NULL;
    pfgluNurbsCallbackDataEXT = NULL;
    pfglLoadTransposeMatrixfARB = NULL;
    pfglLoadTransposeMatrixdARB = NULL;
    pfglMultTransposeMatrixfARB = NULL;
    pfglMultTransposeMatrixdARB = NULL;
    pfglCompressedTexImage3DARB = NULL;
    pfglCompressedTexImage2DARB = NULL;
    pfglCompressedTexImage1DARB = NULL;
    pfglCompressedTexSubImage3DARB = NULL;
    pfglCompressedTexSubImage2DARB = NULL;
    pfglCompressedTexSubImage1DARB = NULL;
    pfglGetCompressedTexImageARB = NULL;
    pfglSampleCoverageARB = NULL;
    pfglSamplePassARB = NULL;
    pfglColorTableEXT = NULL;
    pfglColorSubTableEXT = NULL;
    pfglGetColorTableEXT = NULL;
    pfglGetColorTableParameterivEXT = NULL;
    pfglGetColorTableParameterfvEXT = NULL;
    pfglSecondaryColor3bEXT = NULL;
    pfglSecondaryColor3bvEXT = NULL;
    pfglSecondaryColor3dEXT = NULL;
    pfglSecondaryColor3dvEXT = NULL;
    pfglSecondaryColor3fEXT = NULL;
    pfglSecondaryColor3fvEXT = NULL;
    pfglSecondaryColor3iEXT = NULL;
    pfglSecondaryColor3ivEXT = NULL;
    pfglSecondaryColor3sEXT = NULL;
    pfglSecondaryColor3svEXT = NULL;
    pfglSecondaryColor3ubEXT = NULL;
    pfglSecondaryColor3ubvEXT = NULL;
    pfglSecondaryColor3uiEXT = NULL;
    pfglSecondaryColor3uivEXT = NULL;
    pfglSecondaryColor3usEXT = NULL;
    pfglSecondaryColor3usvEXT = NULL;
    pfglSecondaryColorPointerEXT = NULL;
    pfglPNTrianglesiATIX = NULL;
    pfglPNTrianglesfATIX = NULL;
    pfglCombinerParameterfvNV = NULL;
    pfglCombinerParameterfNV = NULL;
    pfglCombinerParameterivNV = NULL;
    pfglCombinerParameteriNV = NULL;
    pfglCombinerInputNV = NULL;
    pfglCombinerOutputNV = NULL;
    pfglFinalCombinerInputNV = NULL;
    pfglGetCombinerInputParameterfvNV = NULL;
    pfglGetCombinerInputParameterivNV = NULL;
    pfglGetCombinerOutputParameterfvNV = NULL;
    pfglGetCombinerOutputParameterivNV = NULL;
    pfglGetFinalCombinerInputParameterfvNV = NULL;
    pfglGetFinalCombinerInputParameterivNV = NULL;
    aglDellocEntryPoints (); // ÉoÉìÉhÉãÇÃÉ_ÉìÉv
}


// ==========================

// ÉtÉ@ÉìÉNÉVÉáÉìåƒÇ—èoǵÇÃó·
// Åièâä˙âªèàóùÇÃè⁄ç◊ÇÕè»ó™Åj

    pfglLoadTransposeMatrixf (faddr);
    pfglLoadTransposeMatrixfARB (faddr);
    pfglCombinerParameterfvNV (enumparam, faddr);

ÉäÉXÉg 2. é∏ÇÌÇÍÇΩ CFM ÉGÉìÉgÉäÉ|ÉCÉìÉgÇÃåüèo


OpenGL ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕó·ÇÃÇ≤ÇΔÇ≠ÅAÅiìÆìIÇ…ÉçÅ[ÉhÇ≥ÇÍǃǢÇÈǩǫǧǩDžǩǩÇÌÇÁÇ∏ÅjâΩÇÁÇ©ÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇåƒÇ—èoÇ∑ëOÇ…ÇÕÅAåªç›ÇÃÉåÉìÉ_ÉâÇÃÉoÅ[ÉWÉáÉìÇ‹ÇΩÇÕägí£ÉXÉgÉäÉìÉOÇÉ`ÉFÉbÉNǵǃÅAïKóvÇ»ägí£Ç™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈDZÇΔÇämîFÇ∑ÇÈÇ◊Ç´Ç≈Ç∑ÅBÉäÉìÉNéûÇ‹ÇΩÇÕé¿çséûÇ…Ç®ÇØÇÈÉGÉìÉgÉäÉ|ÉCÉìÉgÇÃë∂ç›ÇÕÅAì¡íËÇÃÉåÉìÉ_ÉâÇ≈ì¡íËÇÃägí£Ç™ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈDZÇΔÇà”ñ°Ç∑ÇÈLJÇÃÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅB


[2002 îN 12 åé 23 ì˙]